前言
全局变量、局部变量、类变量、实例变量,必须要分清
基本概念
全局变量:模块内、所有函数外、所有class外
局部变量:函数内、class的方法(类方法、静态方法、实例方法)内,且变量前面没有修饰
类变量:class内,不在class的任何方法内
实例变量:class的方法内,使用self修饰
【全局变量】与【局部变量】举例
ahead = 'HelloWorld' #ahead是全局变量
showList = [] #showList也是全局变量
def print_ahead():
print(ahead) #在该函数中没有称为ahead的局部变量,此处实际调用的是全局变量ahead
def print_other():
city = 'beijing' #city是局部变量
print(city + ahead) #局部变量 与 全局变量 拼接
def print_list():
global showList #global关键字表示引用的是全局变量showList
showList.append(1)
showList.append(2)
print(showList)
print_ahead()
print_other()
print_list()
输出结果:
HelloWorld
beijingHelloWorld
[1, 2]
【类变量】与【实例变量】举例
class Person(object):
TAG = "Person" #TAG是类变量
def __init__(self, name): #self表示当前实例对象
print(Person.TAG) #类变量TAG被访问
self.personName = name #personName是实例变量
def print_name(self):
group = "BeiJing_" #group是局部变量
print(group + self.personName) # 局部变量 与 实例变量 拼接
if __name__ == "__main__":
p = Person("WangYuanWai")
p.print_name()
输出结果:
Person
BeiJing_WangYuanWai
全局变量与局部变量同名
firstValue = "Hello World"
def print_str():
firstValue = "hi man"
print(firstValue) #注意:这里的firstValue调用的是局部变量firstValue,在方法中直接覆盖掉同名的全局变量firstValue
如果在print_str函数中没有使用global关键字显式引用全局变量,在print_str函数中将优先使用局部变量,而不是全局变量
省略global关键字
当你的函数里只读取全局变量的值,此时可省略global,Python解释器明白你访问的是全局变量
first = 100 #first是全局变量
def my_hello():
print(first) #只是访问(读取)全局变量first的值,无需global修饰(加上global更规范)
不可省略global关键字
name = "王员外"
def change_name():
global name
name = name + "非常牛"
上面的代码必须加上global修饰变量,说明先访问全局变量name的值,然后再相加,最后赋值全局变量,如果没有global修饰,Python解释器会无法找到name,因为此时Python解释器认为name为局部变量,应该先创建,一般会看到下午的Error,表示未创建局部变量
UnboundLocalError: local variable 'name' referenced before assignment
不可省略global关键字2
my_name = "员外"
def baby():
my_name = "四大才子"
print(my_name) #注意:此处访问的是局部变量my_name,全局变量my_name并没有改变
baby()
print(my_name)
输出:
四大才子
员外
Python中的一切都是对象
全局变量:属于模块对象的属性
类变量:属于类对象的属性
实例变量:属于实例对象的属性
局部变量:属于方法对象或函数对象的属性吗?不属于………函数对象或者方法对象必须显式的添加属性……